//题目:
// 给定一个区间的集合 intervals ，其中 intervals[i] = [starti, endi] 。
// 返回 需要移除区间的最小数量，使剩余区间互不重叠 。

// 注意 只在一点上接触的区间是 不重叠的。例如 [1, 2] 和 [2, 3] 是不重叠的。

// 示例 1:
// 输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
// 输出: 1
// 解释: 移除 [1,3] 后，剩下的区间没有重叠。

// 示例 2:
// 输入: intervals = [ [1,2], [1,2], [1,2] ]
// 输出: 2
// 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

// 示例 3:
// 输入: intervals = [ [1,2], [2,3] ]
// 输出: 0
// 解释: 你不需要移除任何区间，因为它们已经是无重叠的了。
 
// 提示:
// 1 <= intervals.length <= 105
// intervals[i].length == 2
// -5 * 104 <= starti < endi <= 5 * 104
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
//代码
class Solution 
{
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) 
    {
        //题意转化：移除最小区间数量 = n - 找到最长连续区间的长度

        // int n=intervals.size();
        // sort(intervals.begin(),intervals.end());
        // //法一：动态规划————O(N^2) 超时
        // //1.创建dp表————dp[i]表示：以intervals[i]为结尾的最长连续子区间的长度
        // vector<int> dp(n+1,1);
        // //2.初始化————暂无
        // //3.填表————动态转移方程：dp[i]=max(dp[0]~dp[i-1])+1;
        // int ret_len=1;
        // for(int i=1;i<n;i++)
        // {
        //     //找到i前的符合条件的最长子区间
        //     for(int j=i-1;j>=0;j--)
        //     {
        //         if(intervals[j][1]<=intervals[i][0])
        //             dp[i]=max(dp[i],dp[j]+1);
        //     }
        //     ret_len=max(ret_len,dp[i]);
        // }
        // //4.确定返回值
        // return n-ret_len;


        if (intervals.empty()) {
            return 0;
        }
        
        sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
            return u[1] < v[1];
        });

        //法二：贪心————O(Nlog(N))
        int n = intervals.size();
        int right = intervals[0][1];
        int ans = 1;
        for (int i = 1; i < n; ++i) {
            if (intervals[i][0] >= right) {
                ++ans;
                right = intervals[i][1];
            }
        }
        return n - ans;
    }
};